package br.com.aquinoevasconcelos.control;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.aquinoevasconcelos.excecao.EmailException;
import br.com.aquinoevasconcelos.excecao.ValidacaoException;
import br.com.aquinoevasconcelos.modelos.Agendamento;
import br.com.aquinoevasconcelos.repositorio.IRepositorioAgendamento;
import br.com.aquinoevasconcelos.repositorio.RepositorioAgendamento;
import br.com.aquinoevasconcelos.util.SendMail;
import br.com.aquinoevasconcelos.util.Validacao;

/**
 * @author Paulo Roberto
 * @email paulolima2008@hotmail.com
 * @version 1.0 @ Propriedade da Techcode
 */

public class ControladorAgendamento {

	private ArrayList<Agendamento> agendamentoCadastrados;
	private IRepositorioAgendamento agendar;
	private String data;
	private String hora;

	// construtor da classe
	public ControladorAgendamento(IRepositorioAgendamento agendamento) {
		this.agendar = agendamento;
	}

	// -------------------------------------------------------------------------
	public void inserirAgendamento(Agendamento agendamento)
			throws ValidacaoException, ParseException {

		
		agendar = new RepositorioAgendamento();
		data = agendamento.getData();
		hora = agendamento.getHora();
		agendamentoCadastrados = new ArrayList<Agendamento>();
		String horaSistema = new Validacao().getHora(); 
		
		String subHora = horaSistema.substring(0,2);
		String subMinuto = horaSistema.substring(3,5);
		
		int horaSistemaAtual = Integer.parseInt(subHora+subMinuto);
		

		// pegar data do sistema e transforma em um date para realizar a validacao
		String dataSistema = new Validacao().eventoDataSistema(); 
		DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
		Date dataAtual = (Date) formatter.parse(dataSistema);
		
		// data do agendamento
		DateFormat formatter2 = new SimpleDateFormat("dd/MM/yyyy");
		Date dataAgendamento = (Date) formatter2.parse(data);

		// Verificar se existe no BD a data e hora que o usuario cadastrou

		try {
			agendamentoCadastrados = (ArrayList<Agendamento>) agendar
					.pesquisaAgendamento("FROM agendamento WHERE data = '"
							+ data + "' AND hora = '" + hora + "'");
		} catch (Exception e) {
			e.printStackTrace();
		}

		// arrayList agendamentoCadastrados for vazio
		if (agendamentoCadastrados.size() == 0) {

			
			// verificar se a hora que o usuario digitou corresponde a logica
			if (hora.equals("8:00 AM") || hora.equals("9:00 AM")
					|| hora.equals("10:00 AM") || hora.equals("11:00 AM")
					|| hora.equals("14:00 PM") || hora.equals("15:00 PM")
					|| hora.equals("16:00 PM") || hora.equals("17:00 PM")) {

				// Validacao do campo nomeUsuario
				if (new Validacao()
						.campoTemNumero(agendamento.getNomeUsuario()) == true
						|| new Validacao().campoVazio(agendamento
								.getNomeUsuario()) == true
						|| new Validacao().verificarQuantidadeCaracter(
								agendamento.getNomeUsuario(), 100) == true) {
					throw new ValidacaoException();
				}

				// Validacao do campo titulo
				else if (new Validacao()
						.campoTemNumero(agendamento.getTitulo()) == true
						|| new Validacao().campoVazio(agendamento.getTitulo()) == true
						|| new Validacao().verificarQuantidadeCaracter(
								agendamento.getTitulo(), 100) == true) {
					throw new ValidacaoException();
				}
				

				
				//dataAgendamento.after(dataAtual);
				
				else if (dataAgendamento.before(dataAtual)){
				throw new ValidacaoException();
				}
				
				
				else if (data.equals(dataSistema)){
					if (horaSistemaAtual >= 800 || horaSistemaAtual >= 900|| horaSistemaAtual >= 1000|| horaSistemaAtual >= 1100
							|| horaSistemaAtual >= 1400|| horaSistemaAtual >= 1500|| horaSistemaAtual >= 1600|| horaSistemaAtual >= 1700){
						throw new ValidacaoException();
					}
				}
				

				// caso as validacoes esteja ok salvar no BD
				else {
					agendar.inserirAgendamento(agendamento);
					try {
						emailConfirmarAgendamento(agendamento.getNomeUsuario(),
								agendamento.getData(), agendamento.getHora(),
								agendamento.getEmail(),
								agendamento.getContador());
					} catch (EmailException e) {
						e.printStackTrace();
					}
				}

			}
			// Se o horario estiver errado
			else {
				throw new ValidacaoException();
			}

			// Se o ArrayList agendamentoCadastrados nao estive vazio
		} else {
			throw new ValidacaoException();
		}

	}

	// --------------------------------------------------------------------------
	public void removerAgendamento(Agendamento agendamento, String nome,
			String msgResposta, String emailDestinatario, String data,
			String hora){
		SendMail sm = new SendMail();

		
		String resposta = "Sr(a).: "
				+ nome
				+ "\n\nInfelismente o seu agendamento marcado para o data: "
				+ data
				+ " & hora: "
				+ hora
				+ "\n não vai poder ser realizado!\n\n"
				+ msgResposta
				+ "\n\nAntenciosamente Aquino&Vasconcelos Consultoria Contábil.\n\n";


		sm.sendMail("tech.code.projetos@gmail.com", emailDestinatario,
				"Aquino&Vasconcelos- Consultoria", resposta);
		
		
		agendar.removerAgendamento(agendamento);
	}

	// --------------------------------------------------------------------------
	public List<Agendamento> listaAgendamento() {
		return agendar.listaAgendamento();
	}

	// --------------------------------------------------------------------------
	public List<Agendamento> verificarAgendamento(String query) {
		return agendar.pesquisaAgendamento(query);
	}

	// --------------------------------------------------------------------------
	public void emailConfirmarAgendamento(String nome, String data,
			String hora, String emailDestinatario, String contador)
			throws EmailException {

		SendMail sm = new SendMail();

		String resposta = "AGENDAMENTO DE VISITAS ONLINE"
				+ "\n\nSr(a).: "
				+ nome
				+ "\n\n O Agendamento foi Realizado Com sucesso. por Gentileza comparecer ao escritório\n"
				+ "10 minutos antes do seu horário pré-definido."
				+ "\n\n-------------------DETALHES DO AGENDAMENTO-------------------------\n"
				+ "NOME DO CLIENTE OU VISITANTE: "
				+ nome
				+ "\nDATA DO AGEDAMENTO: "
				+ data
				+ "\nHORARIO: "
				+ hora
				+ "\nCONTADOR PARA ATENDIMENTO:"
				+ contador
				+ "\n--------------------------------------------------------------"
				+ "\n\nAntenciosamente Aquino&Vasconcelos Consultoria Contábil !";

		sm.sendMail("tech.code.projetos@gmail.com", emailDestinatario,
				"Aquino&Vasconcelos- Consultoria", resposta);

	}
	// ----------------------------------------------------------------------------
}
